package com.viknix.threadpool.manager.server.dependence.monitor.publisher;

import com.viknix.threadpool.manager.server.dependence.lifecycle.Closeable;
import com.viknix.threadpool.manager.server.dependence.monitor.event.Event;
import com.viknix.threadpool.manager.server.dependence.monitor.listeners.Listener;

/**
 * @Author: Dongqi
 * @Date: 2021/11/2 10:36
 * @Version 1.0
 * @Description: 事件多播器
 */
public interface EventPublisher extends Closeable {

    /**
     * 初始化多播器，启动多播器线程处理事件
     *
     * @param bufferSize 阻塞队列最大容量
     */
    void init(Class<? extends Event> type, int bufferSize);

    /**
     * The number of currently staged events.
     *
     * @return event size
     */
    long currentEventSize();

    /**
     * 向多播器中注册监听者
     *
     * @param listener 监听器
     */
    void addSubscriber(Listener listener);

    /**
     * Remove listener.
     *
     * @param listener {@link Listener}
     */
    void removeSubscriber(Listener listener);

    /**
     * 发布事件
     *
     * @param event 事件源对象
     * @return 是否发布成功
     */
    boolean publish(Event event);

    /**
     * 通知某个订阅者
     *
     * @param listener 监听器对象
     * @param event 事件源对象
     */
    void notifySubscriber(Listener listener, Event event);
}
